package br.com.actionsystem.gdp.dao;

import br.com.actionsystem.gdp.modelo.Atividade;
import br.com.actionsystem.gdp.modelo.Historico;
import br.com.actionsystem.gdp.util.DaoException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class PagamentoDaoImpl implements IntPagamentoDao {

    EntityManager em;
    Query q;

    public PagamentoDaoImpl() {
        em = ConexaoSingleton.getConexao();
    }

    public List<Historico> getHistoricos(Date inicio, Date fim) throws DaoException {
        try {
            q = em.createQuery("select h from Historico h where h.dataPagamento between :inicio and :fim " +
                    "order by h.dataPagamento");
            q.setParameter("inicio", inicio);
            q.setParameter("fim", fim);
            return q.getResultList();
        } catch (Exception ex) {
            throw new DaoException("Não foi possivel acessar os dados do historico.", ex);
        }
    }

    public Historico getMaxHistorico(Atividade a) {
        q = em.createQuery("select max(h.idHistorico) from Historico h join h.idAtividadeFK a where a.idAtividade = :id");
        q.setParameter("id", a.getIdAtividade());
        return em.find(Historico.class, q.getSingleResult());
    }

    public Date getHistMaiorData() {
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DAY_OF_YEAR, 15);
        q = em.createQuery("select h from Historico h where h.isPago = false and h.dataPagamento < :data " +
                "order by h.dataPagamento");
        q.setParameter("data", c.getTime());
        List<Historico> lista = q.getResultList();
        if (!lista.isEmpty()) {
            return lista.get(0).getDataPagamento();
        }
        return new Date();
    }

    public void deleteHistorico(Atividade a) {
        Query query = em.createQuery("select a from Atividade a, Historico h  where h.idAtividadeFK.idAtividade = :atividade");
        query.setParameter("atividade", a.getIdAtividade());
        List<Historico> lista = query.getResultList();
        em.getTransaction().begin();
        for (Historico h : lista) {
            em.remove(h);
        }
        em.flush();
        em.getTransaction().commit();
    }

    public void deleteHistorico(Historico h) {
        em.getTransaction().begin();
        em.remove(h);
        em.getTransaction().commit();
    }

    public void salvaPagamento(Historico h) throws DaoException {
        try {
            em.getTransaction().begin();
            em.persist(h);
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            throw new DaoException("Dados não forão salvos!", ex);
        }
    }
}
